package pathfinding
{
	public class astar
	{
		private var Punkty:Vector.<Obszar>;
		private var Otwarte:Vector.<Portal>;
		private var Start:Obszar;
		private var Stop:Obszar;
		private var temp:Vector.<Portal>;
		
		public function astar(Obszary:Vector.<Obszar>,start:int,stop:int)
		{
			
			this.Punkty=Obszary;
			temp=new Vector.<Portal>();
			Start=Punkty[start];
			Stop=Punkty[stop];
			Otwarte=new Vector.<Portal>();
			for(var x:int;x<Start.sasiedzi.length;x++)
			{
				Otwarte.push(Start.sasiedzi[x]);
			}
			
			szukaj();
			
		}
		
		private function szukaj():void
		{
			while(Otwarte.length!=0)
			{
				Otwarte=quicksort.sort(Otwarte,0,Otwarte.length-1);
				var obecny:Portal=Otwarte[0];
		        obecny.zamkniety=true;
				trace("OBECNY "+obecny.id);
				Otwarte.splice(0,1);
				if(obecny.id!=Stop.id)
				{
				  for(var i:int=0;i<Punkty[obecny.id].sasiedzi.length;i++)
				  {
					if( Punkty[obecny.id].sasiedzi[i].zamkniety==false)
					{
					  if(Punkty[obecny.id].sasiedzi[i].id!=obecny.obszar)
					  {
					  trace("OBECNY "+obecny.id+" SPRAWDZA: "+Punkty[obecny.id].sasiedzi[i].id);
					  var tempG:Number=odlegloscodsasiada(obecny,Punkty[obecny.id].sasiedzi[i]);
					  var tempH:Number=odlegloscodcelu(Punkty[obecny.id].sasiedzi[i],Stop.sasiedzi[0]);
					 
					  if(Punkty[obecny.id].sasiedzi[i].F<tempG+tempH)
					  {
					  Punkty[obecny.id].sasiedzi[i].G=tempG;
					  Punkty[obecny.id].sasiedzi[i].H=tempH;
					  Punkty[obecny.id].sasiedzi[i].F=tempG+tempH;
					 
					  Punkty[obecny.id].sasiedzi[i].Rodzic=obecny;
					  trace(Punkty[obecny.id].sasiedzi[i].F);
					  Otwarte.push(Punkty[obecny.id].sasiedzi[i]);
					  }
					  }
					  
					}
					
					  
				  }
				}
				else break;
				
			}
				
			
			rysuj(obecny);
		}
		
		private function odlegloscodsasiada(obecny:Portal,sasiad:Portal):Number
		{
			var dokwadratuX:Number= Math.pow((obecny.xyz.x-sasiad.xyz.x),2);
			var dokwadratuY:Number= Math.pow((obecny.xyz.y-sasiad.xyz.y),2);
			var dokwadratuZ:Number= Math.pow((obecny.xyz.z-sasiad.xyz.z),2);
			var suma:Number=dokwadratuX+dokwadratuY+dokwadratuZ;
			return Math.sqrt(suma);
		}
		
		private function odlegloscodcelu(obecny:Portal,Stop:Portal):Number
		{
			var dokwadratuX:Number=Math.pow((obecny.xyz.x-Stop.xyz.x),2);
			var dokwadratuY:Number=Math.pow((obecny.xyz.y-Stop.xyz.y),2);
			var dokwadratuZ:Number=Math.pow((obecny.xyz.z-Stop.xyz.z),2);
			var suma:Number=dokwadratuX+dokwadratuY+dokwadratuZ;
			return Math.sqrt(suma);
		}
		
		private function rysuj(x:Portal):void
		{
			trace(x.id);
			
			try
			{
			temp.push(x);
			rysuj(x.Rodzic);
			}
			catch(err:Error){};
			
		}
		
		public function ret():Vector.<Portal>
		{
			temp.reverse();
			return temp;
		}
		
	}
}